/*
 ============================================================================
 Trabalho   : TP3
 Autor      : Pablo Henrique dos Reis
 Descrição  : Paradigmas de Projetos de Algoritmos
 Algoritmo  : Programção Dinâmica
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "entradaSaida.h"
#include "guitarra.h"

#define LEITURA "r"
#define MAX_LINHA 999

/**
 * Extrai de uma string
 */
int *extrairInteiros(char *str, int qtd) {

	int *retorno  = (int*)malloc(sizeof(int)*qtd);
	int indice = 0;
	char * pch = (char*) strtok(str, " ");

	while (pch != NULL) {
		int inteiro = atoi(pch);
		retorno[indice] = inteiro;

		indice++;
		pch = (char *) strtok(NULL, " ");
	}

	return retorno;
}

/**
 * Preenche uma lista encadeada de casos de testes do show
 * com base em um arquivo de entrada
 * ListaCasos -> lista encadeada de casos
 * entrada -> nome do arquivo de entrada
 */
void preencherListaCasos(ListaCasos *L, char *entrada) {
	FILE *arq = NULL;

	char buffer[MAX_LINHA];

	abrirArquivo(&arq,entrada,LEITURA);

	while(lerLinha(buffer, MAX_LINHA, &arq) != NULL) {

		int *dados = extrairInteiros(buffer,3);
		int numMusicas = dados[0];
		int volumeInicial = dados[1];
		int volumeLimite = dados[2];
		free(dados);

		lerLinha(buffer, MAX_LINHA, &arq);
		int *variacoes = extrairInteiros(buffer,numMusicas - 1);

		inserirCasoTeste(L,numMusicas,volumeInicial,volumeLimite,variacoes);

	}


}

/**
 * Função principal
 *
 * Recebe como único argumento o nome do arquivo com os casos de teste
 *
 */
int main(int argc, char *argv[]) {

	ListaCasos L;
	criarListaCasos(&L);

	char *nomeArquivo = argv[1];

	preencherListaCasos(&L,nomeArquivo);

	PCasoTeste aux = L.Primeiro->prox;
	while (aux != NULL) {
		int volume = volumeUltimaMusicaDinamico(aux);
		printf("%d\n",volume);
		aux = aux->prox;
	}
	liberaCasosTeste(L);

	return 0;
}
